package smlab.utils
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.DisplayObject;
	import flash.display.DisplayObjectContainer;
	import flash.display.Loader;
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.geom.Matrix;
	import flash.geom.Point;
	import flash.geom.Rectangle;
	
	/**
	 * 显示对象辅助类
	 * @author simon
	 * 
	 */
	public class DisplayObjectUtil
	{
		public function DisplayObjectUtil()
		{
		}
		
		/**
		 * 获取一个显示对象的子对象，如果是 MovieClip 类型，会自动停在第一帧
		 * @param parent
		 * @param childName
		 * @return 
		 * 
		 */
		public static function getChildByName($parent:DisplayObjectContainer,childName:String=""):Object{
			if($parent && $parent.numChildren>0 && childName!=""){
				var obj:DisplayObject=$parent.getChildByName(childName);
				if(obj is MovieClip){
					MovieClip(obj).gotoAndStop(1);
				}
				return obj;
			}else{
				return null;
			}
		}
		
		/**
		 * 删除一个容器中的所有显示对象
		 * @param container
		 * 
		 */
		public static function removeAllChild(container:DisplayObjectContainer):void{
			while(container.numChildren>0){
				container.removeChildAt(0);
			}
		}
		
		/**
		 * 将一个显示对象从它的父级容器中删除
		 * @param target
		 * 
		 */
		public static function removeFromParent(target:DisplayObject):void{
			if(target){
				if(target.parent){
					try{
						//有些 DisplayObjectContainer 比如 Loader 调用 removeChild 会报错所以要try
						target.parent.removeChild(target);
					}catch(e:*){
						
					}
				}
			}
		}
		
		/**
		 * 获取 taget 相对于舞台的坐标
		 * @param taget 显示对象
		 * @param stage 舞台
		 * @return 返回坐标（以 Point 的形式）
		 * 
		 */
		public static function getGlobalPoint(taget:DisplayObject):Point{
			if(!taget || !taget.parent || !taget.stage){
				return new Point;
			}
			return taget.parent.localToGlobal(new Point(taget.x,taget.y));
		}
		
		/**
		 * 获取全局舞台中的某个点在 taget 内部的坐标
		 * @param taget
		 * @param p
		 * @return 
		 * 
		 */
		public static function getLocalPoint(taget:DisplayObject,p:Point):Point
		{
			return taget.globalToLocal(p);
		}
		
		/**
		 * 设置一个显示对象的可见范围
		 * @param d
		 * @param newW
		 * @param newH
		 * @param $x
		 * @param $y
		 * 
		 */
		public static function setRect(d:DisplayObject,newW:Number=0,newH:Number=0,$x:Number=0,$y:Number=0):void{
			var rect:Rectangle=new Rectangle($x,$y,newW,newH);
        	d.scrollRect=rect;
        }
		
		/**
		 * 把一个显示对象拷贝为 Bitmap 副本
		 * @param taget
		 * @return 
		 * 
		 */
		public static function copyToBitMap(taget:DisplayObject):Bitmap
		{
			var rect:Rectangle=taget.getRect(taget);
			var ma:Matrix=new Matrix(1,0,0,1,-rect.x,-rect.y);
			var bmd:BitmapData=new BitmapData(rect.width,rect.height,true, 0);
			bmd.draw(taget,ma)
			var bm:Bitmap=new Bitmap(bmd);
			
			return bm;
		}
		
		/**
		 * 获取显示对象的注册点
		 * （相对于这个显示对象左上角(0,0)点的坐标点）
		 * @return
		 */
		public static function getRegPoint(dis:DisplayObject):Point {
			var bounds:Rectangle = dis.getBounds(dis);
			var t:Matrix = dis.transform.matrix;//scaleX, scaleY 设负值时有bug(故使用matrix判断)
			var _scaleX:Number = t.a;
			var _scaleY:Number = t.d;
			var p:Point = new Point();
			p.x = _scaleX > 0 ? -(bounds.left * _scaleX) : -(bounds.right * _scaleX);
			p.y = _scaleY > 0 ? -(bounds.top * _scaleY) : -(bounds.bottom * _scaleY);
			return p;
		}
		
		/**
		 * 画一个遮罩（用于阻止显示对象下方的鼠标操作）
		 * @param d			
		 * @param color
		 * @param alpha
		 * @return 			返回绘制的遮罩MC
		 * 
		 */
		public static function drawMaskBG(d:DisplayObjectContainer,color:uint=0,alpha:Number=0.5):Sprite 
		{
			var _screenBg:Sprite=new Sprite;
			_screenBg.graphics.beginFill(color,alpha);
			_screenBg.graphics.drawRect(0,0,5,5);
			_screenBg.graphics.endFill();
			
			if(d.parent){
				if(d.stage != null){
					var p:Point=d.globalToLocal(new Point(0,0));
					_screenBg.x=p.x;
					_screenBg.y=p.y;
					_screenBg.width=d.stage.stageWidth;
					_screenBg.height=d.stage.stageHeight;
				}
			}
			
			d.addChildAt(_screenBg,0);
			
			return _screenBg;
		}
		
		//将 loader 加载好的显示对象生产一份 bitmap 副本
		public static function getBitmapFromLoader(loader:Loader):Bitmap 
		{
			return Bitmap(loader.content);
		}
		
	}
}